home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
c
/
stut_src
/
terminal.c
< prev
next >
Wrap
Text File
|
1996-05-27
|
17KB
|
919 lines
/*
* terminal.c
*
* Purpose:
* --------
* Gestion du terminal de sortie (Minitel, Modem)
*
* History:
* --------
* 1993: fplanque: Created
*/
#include "!OPTIONS.H" /* Options de compilation */
#define THIS_FILE "TERMINAL.C v1.00 - 03.95"
/*
* System headers:
*/
#include <stdio.h>
#include <string.h>
#include <tos.h> /* Pour les appels au BIOS */
/*
* Custom headers:
*/
#include "SPEC_PU.H"
#include "SERV_PU.H" /* Codes touches etc... */
#include "ACCENTPU.H"
#include "POPUP_PU.H"
#include "SRIAL_PU.H"
#include "DEBUG_PU.H"
#include "TERM_PU.H"
#include "MINITEL.H" /* Codes minitel */
/*
* ------------------------ FUNCTIONS -------------------------
*/
/*
* init_MinitelPort(-)
*
* Purpose:
* --------
* Init d'un port srie reli un minitel
*
* Algorythm:
* ----------
* Passe par toutes vitesse RS autres ke 4800
* a chak fois dem au minitel de se mettre en 4800
* mets 4800 la fin
* init cran minitel
*
* History:
* --------
* 30.09.94: fplanque: Created
* 19.11.94: flush RX at end
*/
void init_MinitelPort(
int n_port ) /* In: Port concern */
{
static const long l_MinitelRates[] = { 300, 9600, 1200 };
int i;
TRACE1( "Init port %d pour minitel", n_port );
/*
* Utilse toutes les vitesses tour tour:
*/
for( i = 0; i < 3; i++ )
{
TRACE1( " Vitesse teste: %ld", l_MinitelRates[i] );
/*
* Fixe vitesse RS:
*/
SetPort( n_port, l_MinitelRates[i], 'E', 7, MODE_ASYNC1STOP, HANDSHAKE_NONE );
/*
* Passe la prise du minitel en 4800 bps:
*/
Bconout( n_port, '-' );
Bconout( n_port, ESC );
Bconout( n_port, PRO2 );
Bconout( n_port, PROG );
Bconout( n_port, PERI_4800 );
/*
* Laise le temps 20 bytes de partir vers le Minitel:
*/
/* wait( 20 * 100 / (l_MinitelRates[i]/10) ); */
/*
* Attend que les codes aient t mis:
*/
Serial_WaitTXEmpty( n_port );
}
/*
* Fixe vitesse RS 4800:
*/
SetPort( n_port, 4800, 'E', 7, MODE_ASYNC1STOP, HANDSHAKE_NONE );
/*
* initialise l'cran:
*/
csr_off( n_port );
full_cls( n_port );
str_conout( n_port, STUT_FULLNAME "\r\n" STUT_RELEASEINFO "\r\n" );
/*
* Allume l'cran si ncessaire:
*/
allume_minitel( n_port );
/*
* Vide buffer d'entre:
* (Tout ce qui a t reu pdt que le minitel et la RS n'taient
* pas la mme vitesse n'est pas interprtable!! )
*/
FlushRXBuffer( n_port );
}
/*
* MinitelPort_ChgeSpeed(-)
*
* Purpose:
* --------
* Chge la vitesse d'un port srie reli un minitel
*
* Algo:
* -----
* - Demande au minitel de changer de vitesse
* - Attend que TX soit vide
* - Chge vitesse de la prise srie
*
* History:
* --------
* 08.04.95: fplanque: Created
*/
void MinitelPort_ChgeSpeed(
int n_port, /* In: Port concern */
long l_newspeed ) /* In: Code nouvelle vitesse */
{
int n_SpeedCode;
if( l_newspeed == 1200 )
{
n_SpeedCode = PERI_1200;
}
else if( l_newspeed == 4800 )
{
n_SpeedCode = PERI_4800;
}
else
{
signale( "Impossible de passer le minitel la vitesse demande" );
return;
}
/*
* Passe la prise du minitel la vitesse demande:
*/
Bconout( n_port, ESC );
Bconout( n_port, PRO2 );
Bconout( n_port, PROG );
Bconout( n_port, n_SpeedCode );
/*
* Attend que les codes aient t mis:
*/
Serial_WaitTXEmpty( n_port );
/*
* Fixe vitesse RS:
*/
SetPort( n_port, l_newspeed, 'E', 7, MODE_ASYNC1STOP, HANDSHAKE_NONE );
/*
* Vide buffer d'entre:
* (Tout ce qui a t reu pdt que le minitel et la RS n'taient
* pas la mme vitesse n'est pas interprtable!! )
*/
FlushRXBuffer( n_port );
}
/*
* param_local(-)
*
* Purpose:
* --------
* Paramtre Minitel pour connexion locale
*
* Algorythm:
* ----------
* Au cas ou on est en mode Tlinfo,
* il faut en sortir avec un squence spciale
* On fait un Reset Vidotex
* Empeche l'echo local des caractres taps
*
* Suggest:
* ------
* Faire le flush ailleurs pour viter le wait(5)
*
* History:
* --------
* 1993: fplanque: Created
* 05.12.94: fplanque: Flusx RX a la fin
*/
void param_local(
int device ) /* In: No périf concerné */
{
/*
* Au cas ou on est en mode Tlinfo, il faut en sortir avec un squence spciale:
*/
Bconout ( device, ESC ); /* Retour en std Tltel */
Bconout ( device, CSI );
Bconout ( device, 0x3F );
Bconout ( device, 0x7B );
/*
* On fait un Reset Vidotex
*/
Bconout ( device, ESC ); /* Reset du terminal Tltel */
Bconout ( device, PRO1 );
Bconout ( device, RESET );
/*
* On doit empecher l'echo local des caractres taps:
*/
Bconout ( device, ESC ); /* Blocage Module MODEM */
Bconout ( device, PRO3 );
Bconout ( device, AIGUIL_OFF );
Bconout ( device, RE_MODEM );
Bconout ( device, EM_MODEM );
/*
* On reoit des saloperies en retour, il va falloir les liminer!
*/
wait( 5 );
FlushRXBuffer( device );
}
/*
* allume_minitel(-)
*
* Purpose:
* --------
* Sortie du mode veille sur M2:
*
* History:
* --------
* 08.02.95: fplanque: Created
*/
void allume_minitel(
int device ) /* In: No prif concern */
{
Bconout ( device, ESC );
Bconout ( device, PRO3 );
Bconout ( device, P_STOP );
Bconout ( device, RE_ECRAN ); /* 0x58 */
Bconout ( device, VEILLE );
}
/*
* eteind_minitel(-)
*
* Purpose:
* --------
* passe en mode veille sur M2:
*
* History:
* --------
* 08.02.95: fplanque: Created
*/
void eteind_minitel(
int device ) /* In: No prif concern */
{
Bconout ( device, ESC );
Bconout ( device, PRO3 );
Bconout ( device, P_START );
Bconout ( device, RE_ECRAN ); /* 0x58 */
Bconout ( device, VEILLE ); /* 0x41 */
}
/*
* envoi_porteuse(-)
*
* Purpose:
* --------
* Envoi de porteuse sur une voie utilisant un Minitel pour Modem
*
* Algorythm:
* ----------
* Retournement modem puis envoi porteuse
*
* History:
* --------
* 1993: fplanque: Created
*/
#if ACCEPT_REMOTE
void envoi_porteuse(
int device ) /* In: No périf concerné */
{
/*
* Retournement du modem:
*/
Bconout ( device, ESC );
Bconout ( device, PRO1 );
Bconout ( device, OPPO ); /* 0x6F */
/*
* Envoi porteuse:
*/
Bconout ( device, ESC );
Bconout ( device, PRO1 );
Bconout ( device, CONNEXION ); /* 0x68 */
}
#endif
/*
* deconnecte_modem(-)
*
* Purpose:
* --------
* Deconnecte le modem d'un Minitel
*
* History:
* --------
* 1993: fplanque: Created
* 08.02.95: Libration de ligne sur le M2
*/
void deconnecte_modem(
int device )
{
/*
* Deconnexion modem:
*/
Bconout ( device, ESC );
Bconout ( device, PRO1 );
Bconout ( device, DECONNEXION ); /* 0x67 */
/*
* Libration de ligne:
* En effet, sur Minitel 2, cette libration ne se fait pas avec
* le PRO1+DECO si le bit RPL vaut 1, et comme c'est le cas
* en phase deconnexion... (vu au cours des tests)
* Voir Ý6 p23 dans le STUM2
*/
Bconout ( device, ESC );
Bconout ( device, PRO1 );
Bconout ( device, LL ); /* 0x57 */
}
/*
* param_normal(-)
*
* Purpose:
* --------
* Paramtre Minitel(s) pour connexion normale
*
* Algorythm:
* ----------
* Bloque aiguillage modem -> ecran
* Installe aiguillage prise -> ecran
* L'écran du Minitel local affiche alors la même chose que
* celui du connecté
* Bloque aiguillage clavier -> modem
* Installe aiguillage clavier -> prise
* Lorsqu'on tape au clavier du Minitel local, on se fait alors
* passer pour le connect
*
* History:
* --------
* 1993: fplanque: Created
*/
void param_normal(
int device )
{
/*
* Bloque aiguillage modem -> ecran:
*/
Bconout ( device, ESC );
Bconout ( device, PRO3 );
Bconout ( device, AIGUIL_OFF );
Bconout ( device, RE_ECRAN );
Bconout ( device, EM_MODEM );
/*
* Installe aiguillage prise -> ecran:
*/
Bconout ( device, ESC );
Bconout ( device, PRO3 );
Bconout ( device, AIGUIL_ON );
Bconout ( device, RE_ECRAN );
Bconout ( device, EM_PRISE );
/*
* Bloque aiguillage clavier -> modem:
*/
Bconout ( device, ESC );
Bconout ( device, PRO3 );
Bconout ( device, AIGUIL_OFF );
Bconout ( device, RE_MODEM );
Bconout ( device, EM_CLAVIER );
/*
* Installe aiguillage clavier -> prise:
*/
Bconout ( device, ESC );
Bconout ( device, PRO3 );
Bconout ( device, AIGUIL_ON );
Bconout ( device, RE_PRISE );
Bconout ( device, EM_CLAVIER );
}
/*
* param_minitel(-)
*
* Purpose:
* --------
* Paramtre Calvier Minitel en dbut de connexion
*
* Suggest:
* --------
* Appliquer aussi au minitel distant:
*
* History:
* --------
* 1993: fplanque: Created
*/
void param_minitel(
int device,
BOOL b_Connecte ) /* In: TRUE si connect */
{
/*
* Passe clavier en minuscules:
*/
Bconout ( device, ESC );
Bconout ( device, PRO2 );
Bconout ( device, P_START );
Bconout ( device, MINUSCULES );
/*
* Passe en mode clavier tendu:
*/
Bconout ( device, ESC );
Bconout ( device, PRO3 );
Bconout ( device, P_START );
Bconout ( device, RE_CLAVIER );
Bconout ( device, ETEN );
/*
* Fait de mme pour le clavier du connect:
*/
if( b_Connecte )
{
/*
* Transparence protocole pour ce qui va suivre:
*/
Bconout ( device, ESC );
Bconout ( device, PRO2 );
Bconout ( device, TRANSPARENCE );
Bconout ( device, 9 );
/*
* Passe clavier en minuscules:
*/
Bconout ( device, ESC );
Bconout ( device, PRO2 );
Bconout ( device, P_START );
Bconout ( device, MINUSCULES );
/*
* Passe en mode clavier tendu:
*/
Bconout ( device, ESC );
Bconout ( device, PRO3 );
Bconout ( device, P_START );
Bconout ( device, RE_CLAVIER );
Bconout ( device, ETEN );
}
}
/*
* csr_on(-)
*
* Purpose:
* --------
* Affiche le curseur du terminal Minitel
*
* History:
* --------
* 1993: fplanque: Created
*/
void csr_on( int device )
{
/*
* Allume curseur MINITEL:
*/
Bconout ( device, CSR_ON );
}
/*
* csr_off(-)
*
* Purpose:
* --------
* Efface le curseur du terminal Minitel
*
* History:
* --------
* 1993: fplanque: Created
*/
void csr_off( int device )
{
/*
* Eteind curseur MINITEL:
*/
Bconout ( device, CSR_OFF );
}
/*
* pos(-)
*
* Purpose:
* --------
* Positionne le curseur du terminal Minitel
*
* History:
* --------
* 1993: fplanque: Created
*/
void pos(
int device, /* In: No périf concerné */
int x, /* In: Position horizontale (colomne) */
int y ) /* In: Position verticale (ligne) */
{
/*
* Positionne curseur sur Minitel:
*/
Bconout ( device, 31 );
Bconout ( device, 64 + y );
Bconout ( device, 64 + x );
}
/*
* start_l0(-)
*
* Purpose:
* --------
* Se place sur la ligne 0 et l'efface en vue de l'affichage d'un message
*
* History:
* --------
* 11.05.94: fplanque: Created
*/
void start_l0(
int device ) /* In: No prif concern */
{
/*
* Entre ds la ligne 0:
*/
Bconout ( device, US ); /* Pos en ligne 0 */
Bconout ( device, 64+0 );
Bconout ( device, 64+1 );
Bconout ( device, CAN ); /* CAN */
}
/*
* end_l0(-)
*
* Purpose:
* --------
* Sort de la ligne0 et retourne l'cran normal
*
* Notes:
* ------
* un LF sur le Minitel sort de la ligne0 et retourne la position
* prcdente du curseur en restituant les attributs et tout le reste...
*
* History:
* --------
* 10.05.94: fplanque: Created
*/
void end_l0(
int device ) /* In: No périf concerné */
{
/*
* Sort de la ligne 0:
*/
Bconout ( device, LF );
}
/*
* full_cls(-)
*
* Purpose:
* --------
* Efface l'cran complet du terminal Minitel
*
* Algorythm:
* ----------
* Efface aussi la ligne 0!
*
* History:
* --------
* 1993: fplanque: Created
*/
void full_cls( int device )
{
Bconout ( device, US ); /* Pos en ligne 0 */
Bconout ( device, 64+0 );
Bconout ( device, 64+1 );
Bconout ( device, CAN ); /* CAN */
Bconout ( device, FF ); /* CLS */
}
/*
* set_tcolor(-)
*
* Purpose:
* --------
* Fixe la couleur d'criture du Minitel
*
* History:
* --------
* 1993: fplanque: Created
*/
void set_tcolor( int device, int color )
{
Bconout ( device, 27 ); /* Esc */
Bconout ( device, 64 + color ); /* Code couleur */
}
/*
* set_tcolor(-)
*
* Purpose:
* --------
* passe en inverse vido
*
* History:
* --------
* 13.01.95: fplanque: Created
*/
void term_setReverse( int device )
{
Bconout ( device, 27 ); /* Esc */
Bconout ( device, MNTL_INVERSE_ON );
}
/*
* cconout(-)
*
* Purpose:
* --------
* Envoi d'un caractre au terminal
*
* Notes:
* ------
* L'utilisation de cette fonction n'est franchement pas économique!
*
* Suggest:
* --------
* Implmenter des appels par pointeur en fonction du type de terminal
*
* History:
* --------
* 1993: fplanque: Created
* 24.05.94: Conversion des car>127
*/
void cconout ( int device, int code )
{
if ( code <= 127 )
{ /*
* Si code compatible Minitel:
*/
Bconout( device, code );
}
else
{ /*
* Si caractre spcial: CONVERSION
*/
char * pS_equiv = convert_Asc2Vdt( code );
while( *pS_equiv != '\0' )
{
Bconout( device, *(pS_equiv++) );
}
}
}
/*
* mconout(-)
*
* Purpose:
* --------
* Multiple conout
* Affichage d'un caractre rpt plusieurs fois sur terminal Minitel
*
* Algorythm:
* ----------
* Utilise procdure de rptition <car 18 64+nb-1> du minitel
*
* History:
* --------
* 1993: fplanque: Created
*/
void mconout(
int device,
int code,
int nb ) /* In: Nombre d'occurences afficher */
{
if ( nb > 0 )
{
Bconout( device, code ); /* Affiche 1 fois */
if ( nb == 2 )
{
Bconout( device, code ); /* Affiche 1 deuxime fois */
}
else if ( nb > 2 )
{
Bconout( device, 18 ); /* rptition */
Bconout( device, 64 + nb-1 ); /* nb-1 fois */
}
}
}
/*
* str_conout(-)
*
* Purpose:
* --------
* Envoi d'une chaine de caractres au terminal
*
* History:
* --------
* 1993: fplanque: Created
*/
void str_conout(
int device,
const char * string )
{
/*
* Variables:
*/
int code;
/*
* Envoie la page dans le tampon de sortie:
*/
while
(
code = *(string ++),
code != '\0'
)
{
if ( code <= 127 )
{ /*
* Si code compatible Minitel:
*/
Bconout( device, code );
}
else
{ /*
* Si caractre spcial: CONVERSION
*/
char * pS_equiv = convert_Asc2Vdt( code );
while( *pS_equiv != '\0' )
{
Bconout( device, *(pS_equiv++) );
}
}
}
}
/*
* str_nconout(-)
*
* Purpose:
* --------
* Envoi d'une chaine de caractres au terminal
* avec contrle d'uin nb de cars maximum
*
* History:
* --------
* 13.01.95: fplanque: Created base on str_conout
*/
void str_nconout(
int device,
const char * string,
int n_maxlen ) /* In: Longueur maximum */
{
/*
* Variables:
*/
int code;
/*
* Envoie la page dans le tampon de sortie:
*/
while
(
code = *(string ++),
code != '\0' && (n_maxlen--) > 0
)
{
if ( code <= 127 )
{ /*
* Si code compatible Minitel:
*/
Bconout( device, code );
}
else
{ /*
* Si caractre spcial: CONVERSION
*/
char * pS_equiv = convert_Asc2Vdt( code );
while( *pS_equiv != '\0' )
{
Bconout( device, *(pS_equiv++) );
}
}
}
}
/*
* sconout(-)
*
* Purpose:
* --------
* Envoi d'une squence au terminal
*
* History:
* --------
* 1993: fplanque: Created
*/
void sconout(
int device,
long length,
char * seq )
{
#define WATCH_SCONOUT NO0
/* Variables */
register long offset; /* Offset dans la chaine */
int code; /* Code afficher */
#if WATCH_SCONOUT
printf( "\x1BY\x20\x62***");
#endif
/* Envoie la page dans le tampon de sortie: */
for ( offset = 0; offset < length; offset++ )
{
code = seq[offset]; /* Code traiter */
if ( code <= 127 )
{ /* Si code compatible Minitel: */
Bconout ( device, code );
}
}
#if WATCH_SCONOUT
printf( "\x1BY\x20\x62---");
#endif
/* Ici, Offset=length :: printf("Offset=%lu\n",offset); */
#undef WATCH_SCONOUT
}